WICS 80B ――――――――――――――――――――――――――――――――――――――― I/O 1982年 2月号掲載 MZ−80B マシン語 01500H−037FFH S:01500H 起動方法 TS−1000を起動 L コールドスタート:01500H ホット スタート:01503H ――――――――――――――――――――――――――――――――――――――― 現在ではほとんどのマイクロコンピュータに BASIC言語が備わっており、 数値計算には非常に便利なのですが、 一般的に言ってBASICは制御プログラムや グラフィックス処理などの 高速さを要求される仕事には不向きです。 通常ならば、そのような仕事に対しては、 アセンブラなどでプログラムを開発していたのですが、 プログラムの内容が複雑になるにつれて アセンブラによる開発は困難になってきます。 そのような用途のために、私たちは速度とメモリ効率の点で、 アセンブラ(=機械語)にひけをとらないくらいに 効率のよいZ80コンパイラと、 それと同じ文法のインタープリタとの複合システム(WICS)を 開発しました。   ・――――――――――――――・  /   なぜWICSなのか    \ ・――――――――――――――――――・ 普通、私たちがコンピュータに何か複雑な仕事をやらせる場合、 コンピュータにプログラムを与えることが必要になります。 ところで、コンピュータが直接実行してくれるプログラムは、 必ずそのコンピュータの機械語で書かれているものだけです。 その機械語というのは、人間には ほとんど理解し難い数字(+A〜F)の羅列にしか過ぎないものです。 これでは、どうにもならないので、 その機械語の意味が少しは連想できそうな 適当な単語(ニモニックと呼ぶ)に置き替えたものがアセンブリ言語です。 アセンブリ言語(アセンブラとも言う)は、 コンピュータのハードウェア(CPU)に密着したものなので、 CPUが異なれば当然異なり、普遍的なものではありません。 そこで、もっと人間にとって理解しやすい言語でプログラムを書いて、 それを機械語に変換させよう、 というのがコンパイラ(翻訳系)の考え方です。 ところで、BASICという言語が普及していますが、 BASICはほとんどがコンパイラではなく、 インタープリタ(解釈実行系)です。 BASICは最近流行のPASCALのような構造言語から見れば、 幼稚な言語ですが、その母体であるFORTRANとも似ているし、 初心者にもわかりやすい言語です。 インタープリタはプログラムの作成や実行、 デバッグが非常にやり易いのですが、 その反面、プログラムの実行速度が機械語に比べ はるかに遅くなるという欠点があります それもそのはず、インタープリタはその名のごとく、 人間の書いたプログラムを毎回読みながら それを解釈して実行しているからです。 では、BASICインタープリタで書かれたプログラムを コンパイラにかけて機械語にしてしまってはどうでしょうか。 プログラムの作成とデバッグはインタープリタで行ない、 完成したプログラムをコンパイルすれば、 プログラムの開発は非常に楽になります。 ところで、マイコンではBASICのコンパイラは あまり一般には使われていません。 実数系まで扱うとなるとコンパイラ自体がかなり巨大になり、 テキストやオブジェクトを補助記憶に出し入れしなければならなくなる、 というのも理由の一つですが、 8ビットCPUにとって、実数演算は苦手でかなり処理時間がかかるため、 コンパイルできたとしてもあまり画期的な速度の向上は望めないからです。 また、マイコンを数値計算に使うだけであれば、 インタープリタがいくら遅いといってもプログラム電卓よりは、 はるかに速いし、数値計算の場合は、 計算が終わるまで人間の方が待っていればよいのです。 ところが.マイコンというものは、もっと応用分野の広いものであり、 速度を要求される制御関係や リアルタイム。ジョブ(TVゲームのことかな?)に使おうとすれば、 処理速度が遅くては、使いものにならないのです。 そこで、BASICの使いやすさは捨てずに、 (インタープリタ・モードを持たせる)アセンブラに ひけをとらないくらいのコンパイラを実現しようとしたのが、 このWICSなのです。   ・――――――――――――――・  /    開発にあたって     \ ・――――――――――――――――――・ 言語の開発では、まず文法を決めるのが先ですが、 大まかに言えば、WICSはBASIC文法に ハードウェア制御用やメモリ操作に便利なコマンドなどを付け加え、 その代り実数演算機能は省いています。 さらに、コンパイラを記述しやすいように再婦呼び出し可能にして、 コンパイラをWICS自身で記述することとしました。 また、インタープリタは自己記述は少し無理なので、 BASEアセンブラで記述しています。   ・――――――――――――――・  /    システムの概略     \ ・――――――――――――――――――・ WICSは大きく分けて、インタープリタ、コンパイラ、 マシン語モニタを含んだランタイム・パッケージの3つの部分に分かれています。 ランタイム・パッケージはメモリ常駐になっており、 インタープリタとコンパイラ、それにユーザーの作制した コンパイル・オブジェクトはすべてこのパッケージに依存します。 WICSでのプログラム開発形態は、 かなりユーザーの自由になっていますが、 次のようなものが考えられます。  I)インタープリタのみによる開発。   WICSインタープリタ(もちろんランタイム・パッケージを含む)のみを   用いてプログラムを作る場合です。   これは通常のBASICインタープリタを使うのとほとんど同じ感覚です。   実数演算はありませんが、実数型のBASICにくらべ   2〜3倍の速さを持っています。   また、WICSテキスト・プログラムはメモリが許せば、   いくつでも置くことができます(TEXT命令で切り換えて使用)。  II)インタープリタとコンパイラを両方使う場合。   インタープリタとコンパイラはメモリ上に共存できるので、   両方ともメモリにロードしておいて、   インタープリタでプログラムを編集、デバッグして、   即、コンパイラにかけることができます。   また、コンパイルされたサブルーチンは、   インタープリタからコールすることも自由にできます。   このとき、サブルーチン内の変数名とインタープリタで使う変数名が   重複しても問題はありません。   サブルーチンヘの引数渡しはPUSH、 POP命令で行なうか、   あるいはメモリのフリーエリアに共通の配列をとって行なえます。   マシン語とのリンクも自由にできます   (ただし、インデックス・レジスタはIX、IYともに    ソフトウェア・スタックなので、破壊してはいけません)、  III )インタープリタを切り離す場合。   ユーザープログラムが大きくなって、   ユーザープログラムのオブジェクトを作る場所がなくなったときは、   インタープリタを切り離して、インタープリタ本体のメモリ領域を、   オブジェクト生成に使うこともできます。   また、インタープリタ本体の代わりに、そこにユーザーオブジェクトを置き、   ランタイム・パッケージと共にセーブすれば、   完全独立型オブジェクトを作ることもできます。   いずれの場合もインタープリタを切り離すと   テキスト・プログラムの編集はできなくなります。   特筆すべきことは、コンパイラがかなりのレベルまで   オブジェクトの最適化(生成コードの縮小と高速化)を行なうため、   ソース対オブジェクト比が1対0.6〜0.8程度にまで縮まり、   実行速度は1桁以上向上することです。   また、コンパイル速度は、約 400行/分と高速です。   ・――――――――――――――・  /     文法上の特徴     \ ・――――――――――――――――――・ WICSの文法はBASICとかなり似ています。 なぜ、BASICの構造を選んだかという問いに対しては、 BASICの文法が広く普及している、ということのほかに、 BASICの制御構造が、機械語で比較的実現しやすい、 ということが言えます。 このことは、生成されるオブジェクトの効率を良くすることにもなります。 もしも、PASCALなどの言語構造を使うと、 ローカル変数の割り当てや手続き呼び出しの引数機構のために、 かなりのオーバーヘッドが生じてしまいます。 ただし、BASIC文法と異なる部分も多少あります。 というのは、 (1)変数名は英字(アルファベット)で始まる   英数字(A〜Zと0〜9)からなる任意長で、   予約語(FOR やGOSUBなど)で始まるものでなければ、   すべての文字を識別します。   すなわち、“HENSU” という名前の変数と、   “HENSUI”という名前の変数は区別して扱かわれます。 (2)配列はBASICの配列と異なっていて、   ユーザーがメモリのフリーエリアに指定する形式で、   1バイト配列と2バイト配列があります。   いずれも配列の要素はメモリ番地と直接対応しているので、   メモリ操作ポインタとして使うこともできます   (機械語におけるインデックス・アドレッシングの考え方に似ています)。 (3)ダブル・クォーテーションで囲まれた1文字は、   文字定数として、整数値(そのASCIIコード)に変換されます。 (4)演算子にOR、AND、XORがあり、   これによりピット操作を可能にします。 (5)その他、再帰呼び出しを可能にする   PUSH、 POP命令があり、   FOR〜NEXTやGOSUB〜RETURNとは   別の独立のスタックを持たせているので、   引数をPUSHしたあとでサブルーチンをコールする方法が使えます。  (文法上の注意) (1)GOTO、GOSUB の飛び先行番号は必ず定数でなくてはいけません。 (2)ただし、マシン語を呼び出すCALLでは、番地の代りに   式や名前(変数)も使えます。 (3)FOR に対するNEXTはコンパイラにかけることを考えて、   必ず1対1で対応させること。   ネスティングは可能(スタックの許す限り)ですが、   途中からの飛び出しや飛び込みはコンパイラで走らせる場合、   暴走の原因、非構造化の始まりになります。  (WICSの扱える数値および変数) (1)変数  ●変数は英字(A〜Z)で始まり、英数字(A〜Z、0〜9)から成る   任意の文字列です。  ●変数名の長さに制限はありません。   また、変数名は全文字を識別します。  ●ただし、予約語(FORやGOSUBなど)で始まる文字列は   変数とはみなしません。   予約語が変数名の途中から現われる場合はかまいません   (変数名とみなす)。  ●変数は−32,768〜32,767までの整数値をとることができます。 (2)配列(INDEX)  ●配列は、通常のBASICの DIM文と異なり、   ユーザーがメモリのフリーエリア上に指定するようになっています。  ●2バイト配列:変数名(式)   2バイト配列は(変数の内容+式の値*2) の   メモリ番地の2バイト分の値に対応します。  ●1バイト配列:変数名〔式〕   1バイト配列は、(変数の内容+式の値) の   メモリ番地の1バイトの値に対応します。 WICSでは配列(INDEX)というのは 機械語のインデックス・アドレッシングに相当するもので、 直接的にメモリを操作できます。 (3)定数   i )10進定数:−32768〜32767の範囲の整数。   ii )16進定数:$0000〜$FFFF      (16進数は“$”をはじめに付ける)。   iii )文字定数 :“A”のように、クォーテーション『”』で      くくられた1文字のASCIIコード(整数値に変換される)。 (4)式  〈式〉:=〈項〉〔〈演算子〉〈項〉〕  式は、項と2項演算子より成り立っています。  ●2項演算子を、優先順位の低い順に示します。   1)不等号、等号:>=、=>、<=、=<、=、<>、<、>   2)加減算   :+、−、OR   3)乗除算   :*、/、AND、XOR  ●( )を含む場合は、( )の中が最優先されます。  ●等号、不等号演算子は、左項〈演算子>右項が成立すれば、   その値は1(真)で不成立の場合は、0(偽)の値をとります。  ●OR、AND、XORは、左項と右項の値を16ビットの2進数値とみなして、   各ビットごとに、OR、AND、XORをそれぞれ行ない、   16ビットにまとめて値にするものです。 ―――― 予約されているコマンド、ステートメント、ファンクション表 ――――― 《コマンド》 ・―――――――――――――――――――――――――――――――――――――・ |MON                                  | |  ●モニタに制御を移します。                      | |                                     | |BYE                                  | |  ●MZ−80Bのモニタに戻ります。                  | |                                     | |RUN〔〈行番号〉〕                           | |  ●インタープリタ・モードでプログラムを実行します。          | |  ●行番号を省略すると変数テーブルをクリアして、            | |   プログラムを初めから実行します。                  | |                                     | |LIST〔〈行番号〉〕〔,〕〔〈行番号〉〕                | |  ●テキスト・プログラムを表示します。                 | |  ●リスト行を何行目から何行目まで、という指定もできます。       | |                                     | |DELETE〈行番号〉,〈行番号〉                    | |  ●指定された範囲の行を削除します。                  | |                                     | |VLIST                                | |  ●インタープリタ・モードで使用された変数の名前と           | |   その値をすべて表示します。                     | |                                     | |NEW                                  | |  ●プログラムをすべて消去します。                   | |                                     | |LOAD〔”〈ファイル名〉”〕                      | |  ●カセット・テープからテキスト・プログラムを             | |   現在のテキスト・エリアにロードします。               | |  ●ファイル名を省略すれば、最初にあったプログラムを          | |   ロードします。                           | |                                     | |SAVE〔”〈ファイル名〉”〕                      | |  ●LOADの逆でテキスト・エリアにある“WICS”の         | |   テキスト・プログラムをカセットにセーブします。           | |                                     | |VERIFY〔”〈ファイル名〉”〕                    | |  ●カセットに記録されだWICS”テキストを              | |   テキスト・エリアにあるプログラムと比較します。           | |  ●ファイル名を省略すると最初に見つけた                | |   プログラムとの比較をします。                    | |                                     | |APPEND〔”〈ファイル名〉”〕                    | |  ●カセットに記録された“WICS”テキストを             | |   現在のテキスト・エリア上のプログラムの後に             | |   つづけてロードします。                       | |  ●APPENDでは行番号はそのままですので              | |   注意してください。                         | |                                     | |SYSTEM                               | |  ●現在のテキスト・エリアの先頭、終了、上限の番地を          | |   それぞれ表示します。                        | |                                     | |LIMIT〈番地〉                            | |  ●テキスト・エリアの上限を設定します。                | |  ●通常は$C000番地になっています。                  | |                                     | |TEXT〈番地〉                             | |  ●テキスト・エリアの先頭番地を設定します。              | |  ●同時に終了番地は自動セッ卜されます。                | |                                     | |CLR                                  | |  ●インタープリ夕で使う変数表をクリアします。             | ・―――――――――――――――――――――――――――――――――――――・ ※以上がインタープリタのコマンドです  これらはダイレクト・モード、テキスト・プログラム中  いずれでも使えますか、コンパイラは無視するので注意してください。 《ステートメント》 ・―――――――――――――――――――――――――――――――――――――・ |IF〈式〉THEN〈文〉                         | |  ●式の値が真(0以外の値はすべて真とみなす)             | |   のときTHEN以下の文を実行します。                  | |  ●THENは省略できます。                        | |・−FOR〈変数〉=〈初期値〉TO〈最終値〉〔STEP〈変化幅〉〕    | || 〈繰り返すプログラム〉                        | |・−NEXT〔〈変数〉〕                         | |  ●BASICと同じ繰り返し命令です。                 | |  ●STEPが1のときは、STEP文は省略できます。              | |  ●ただし、STEP値は正の値でなければいけません。            | |                                     | |・−REPEAT                             | || 〈繰り返すプログラム〉                        | |・−UNTIL〈式〉                           | |  ●式の値が真になるまで、REPEATとUNTIL にはさまれた          | |   プログラムを繰り返し実行します。                  | |                                     | |ON〈式〉GOTO〈行番号1〉,〈行番号2〉,…〈行番号N〉       | |  ●式の値が1であれば行番号1へ、                   | |   2であれば行番号2へというように                  | |   式の値の数にある行番号へ飛びます。                 | |   ただし、その値に該当する行番号が書かれていないときは、       | |   分岐せずに次の命令へ行きます。                   | |                                     | |ON〈式〉GOSUB前項と同じ                      | |  ●ON〜GOTOと同じように式の値の番目にある行番号を           | |   サブルーチン・コールします。                    | |                                     | |GOTO〈行番号〉                            | |  ●行番号に分岐します。                        | |                                     | |GOSUB〈行番号〉                           | |  ●行番号をサブルーチン・コールします。                | |                                     | |RETURN                               | |  ●サブルーチンの終わりを示します。                  | |  ●RETURNを実行すると、GOSUB でコールした               | |   プログラム(サブルーチンの呼び主)の GOSUB文の次へ         | |   戻ります。                             | |                                     | |REM                                  | |  ●コメント行です。 REMのあとの文字は実行されません。         | |  ●’(シングルクォーテーション)も REMと同じように使えます。     | |                                     | |PRINT                                | |  ●文字や数値を出力装置に出力します。                 | |   出力装置は、通常は、ディスプレイか指定されます。          | |  ●書式は、次のようなものがあります。                 | |   (1)/(スラッシュ):改行を行なう。                    | |   (2)"文字列":文字列を出力。                    | |   (3)式   :式の値を定められた文字、スペースで右づめ出力する。  | |   (4)#2式  :式の値を16進2桁で出力する。             | |   (5)#4式  :式の値を16進4桁で出力する。             | |   (6)&式   :式の値の ASCII文字を出力する(1文字)。       | |   (7)!式   :式で示めされる番地に格納されている文字列を      | |          $0Dまで出力する。                  | |   (8)%式   :文字スペースを式の値に定める。            | |   (9)+式   :式の値を0〜 65535までの10進数で           | |          (負の扱いをしないで)出力する。           | |  以上の書式は、","(コンマ)で区切れば、                  | |  いくつでも並べることが出来ます。                   | |  注:文字スペースは、次のようになります。               | |    PRINT%5,100[CR]                   | |     100                             | |    |___|                            | |     5文字                             | |                                     | |  注:PRINT文 は、最後に改行を行ないませんので、            | |    改行したいときのみ、"/"(スラッシュ)を入れてください。         | |  注:%(10進出力のフォーマット)は、次の"%"が来るまで有効です。        | |                                     | |INPUT〈変数名〉〔,〈変数名〉…〕                  | |  ●キーボードから数字を入力して、変数に代入していきます。       | |   数字は10進、および16進("$" をはじめに入力)が可能です。       | |  ●“WICS”では文字列に対してBASICとは違う          | |   取り扱いをしているので、文字変数がありません。           | |   したがって、INPUT A$などはできないので               | |   注意してください。                         | |   (このような場合には、LINPUTを使います。)             | |                                     | |STOP                                 | |  ●プログラムの実行を中止して、中止された行番号を表示します。     | |                                     | |END                                  | |  ●プログラムの実行を終わります。                   | |                                     | |CALL〈式〉                              | |  ●式の値の番地にあるマシン語サブルーチンをコールします。       | |                                     | |PUSH〈式〉〔,〈式〉…〕                       | |  式の値を順次、スタックに禎みます。                  | |                                     | |POP〈変数名〉〔,〈式〉…〕                      | |  ●スタックに積まれた値をおろし、順次、変数に代入します。       | |                                     | |OUT〈I/O番地〉,〈式〉                       | |  ●I/O番地 に式の値を出力します。                   | |  ●どちらも0〜 255までの値です。                   | |                                     | |CURSOR〈式1〉,〈式2〉                      | |  ●CRTのカーソルX,Yの座標を式1と式2で指定します。       | |                                     | |POKE〈式1〉,〈式2〉                        | |  ●式1のアドレスに式2の値の下位バイトが代入されます。        | |                                     | |CURH〈式〉                              | |  ●式の値をカーソルのX座標とします。                 | |                                     | |CURV〈式〉                              | |  ●式の値をカーソルのY座標とします。                 | |                                     | |PLOT〈式X〉,〈式Y〉,〈式M〉                   | |  ●式XをXの座標(0〜79),式YをY座標(0〜49)とし、         | |   式MのMODEで、ドットをプロットします。               | |    MODE=0ドットをリセットします。                  | |    MODE=1ドットをセットします。                   | |    MODE=2ドットをリバースします。                  | |                                     | |LINPUT〈式〉                            | |  ●1行入力を行ない、入力された行の文字を               | |   式で指定されるアドレスを行バッファとして、             | |   そのアドレスに1行分の文字を格納します。              | |   また、文字列の最後には終了コードとして$0Dを格納します。      | |                                     | |STA$〔〈式〉,〈”文字列”〉〕                    | |  ●式のアドレスに文字列を ASCIIコードで格納します。          | |                                     | |SPOKE〈式X〉,〈式Y〉,〈式Z〉                  | |  ●CRT上の(X,Y)の座標にZのキャラクタを書きます。       | |   式Xは、0〜39、式Yは、0〜 255までです。             | |   式Zは、ディスプレイ・コードです。                 | |                                     | |GRAPH                                | |  ●グラフィック画面の設定を行ないます。                | |  ●書式は、次のようなものがあります。                 | |   (1)I1:CPUがアクセスできるRAMを               | |       グラフィックRAM1に設定します。             | |   (2)I2:CPUがアクセスできるRAMを               | |       グラフィックRAM2に設定します。             | |   (3)O0:グラフィックRAM1、2のどちらも表示しません。      | |   (4)O1:グラフィックRAM1を画面に表示します。          | |   (5)O2:グラフィックRAM1、2を重ねて、画面に表示します。    | |   (6)C :CPUがアクセスできるRAMをクリアします。        | |   (7)F :CPUがアクセスできるRAMを白でクリアします。      | |                                     | |LINE〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉〔,〈式M〉〕     | |  ●(X,Y)の座標を始点、(X1,Y1)の座標を終点とし、            | |   MのMODE(PLOT参照)で、ドットで線を引きます。         | |  ●(X、Y)、(X1、Y1)のうち、どれか1つでも                | |   面面からはみ出る場合は線は引かれません。              | |                                     | |PLOT〈式X〉,〈式Y〉〔,〈式M〉〕                 | |  ●式をX座標(0〜 319)、式をY座標(0〜 199)とし           | |   式MのMODEでドットをプロットします。                | |    MODE=0 ドットをリセットします。                 | |    MODE=1 トットをセットします。                  | |    MODE=2 ドットをリバース(反転)します。             | |  ●MODEを省略すれば、自動的にセット・モードになります。      | |                                     | |PUT@〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉,〈式A〉〔,〈式M〉〕| |  ●グラフィックRAMの座標(X,Y)と(X1,Y1)を頂点とする         | |   長方形の中に式Aで指定されるアドレスの配列データを         | |   ビット・イメージとして表示します。                 | |  ●式Mは表示モードで,省略すれば1になります             | |   (PLOT参照)。                         | |                                     | |GET@〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉,〈式A〉       | |  ●PUT@と逆の動作をします。                    | |   グラフィックRAMの座標(X,Y)と(X1,Y1)を頂点とする         | |   長方形の中のビット・イメージを式Aで指定される           | |   アドレスの配列に格納します。                    | |                                     | |  注意:格納の順序は、次のようになります。               | |     また、(XI-X) の値は8の倍数でなければなりません。       | |   ・――――――――――――――――――――――――――――・    | |   |        ビット0     ビット7       |    | |   |(X,Y)・―――――――――――――――――・    |    | |   |     |ARRAY〔0〕|ARRAY〔1〕|    |    | |   |     |ARRAY〔2〕|ARRAY〔3〕|    |    | |   |     |ARRAY〔4〕|ARRAY〔5〕|    |    | |   |     ・―――――――――――――――――・    |    | |   |                     (X1,Y1)|    | |   ・――――――――――――――――――――――――――――・    | |                                     | |PAINT〈式X〉,〈式T〉                       | |  ●グラフィックRAMの座標(X,Y) の点を含む閉空間を塗りつぶします。  | |  ●閉空間の図形が複雑すぎる場合は、                  | |   IYスタックがオーバーフローすることがあります。           | |                                     | |CIRCLE〈式X〉,〈式Y〉,〈式R〉〔,〈式M〉〕          | |  ●中心(X,Y) 半径Rの円を描きます。                  | |   X,Y,Rは画面をはみ出した場合、                 | |   画面に映る部分のみ描きます。                    | |                                     | |BELL                                 | |  ●ベルを鳴らす。                           | |                                     | |MUSIC〈”音楽データ”〉                       | |  ●音楽データを演奏します(BASIC SP-5030の仕様と同じ)。     | |                                     | |SOUND〈式1〉,〈式2〉                       | |  ●式1の高さの音を式2の長さだけ鳴らします。             | |  ●音の高さと長さは、音階〈ドレミ)とは異なり、            | |   パルスのカウント幅とパルス数に対応しています。           | |   ・―――――――――――――――――――――・           | |   |                     |           | |   |  ̄|_| ̄|_| ̄|_ ←パルスの数が |           | |   |  ←→          式2で決まる |           | |   |  この長さが式1で決まる        |           | |   ・―――――――――――――――――――――・           | |                                     | |TEMPO〈式〉                             | |  ●MUSIC文 の演奏スピードを指定します。                | |                                     | |PRMODE〈式〉                            | |  ●PRINT出力 の機器を指定します。                   | |   0:CRTのみ出力。                        | |   1:PRINTERのみ出力。                    | |   2:CRT、PRINTER同時出力。                | ・―――――――――――――――――――――――――――――――――――――・ 《ファンクション》 ・―――――――――――――――――――――――――――――――――――――・ |GET                                  | |  ●キー入力が行なわれるまでカーソルを点滅し、             | |   キー入力を行なったときその ASCIIコードを値とします。        | |                                     | |INKEY                                | |  ●リアルタイム入力です。                       | |   キーが押されていなければ0、                    | |   押されていればその ASCIIコードを値とします。            | |                                     | |MODE〔〈式1〉,〈式2〉〕                      | |  ●式1を式2で割った余りを値とします。                | |                                     | |ABS〔〈式〉〕                             | |  ●式が負であれば正の数にします。                   | |   正であれば、それを値とします。                   | |                                     | |SGN〔〈式〉〕                             | |  ●式の符号を値とします。                       | |   式が負であれば-1                          | |   式が0であれば0                          | |   式が正であれば1を値とします。                   | |                                     | |RND〔〈式〉〕                             | |  ●1〜式までの乱数値を値とします。                  | |                                     | |INP〔〈I/O番地〉〕                         | |  ●I/O番地の内容を値とします。                   | |                                     | |ADRS〔〈変数〉〕                           | |  ●変数の格納されているアドレスを値とします。             | |                                     | |PEEK〔〈式〉〕                            | |  ●式のアドレスのメモリ内容を値とします。               | |                                     | |INC〔〈変数〉〕                            | |  ●変数の値を1つ増加させ、その値を値とします。            | |                                     | |DEC〔〈変数〉〕                            | |  ●変数の値を1つ減少させ、その値を値しとします。           | |                                     | |USR〔〈式1〉,〈式2〉〕                       | |  ●式2をHLレジスタに代入した後に、式1のアドレスを          | |   マシン語サブルーチン・コールします。                | |  ●RETURN時のHLの数値を値とします。                  | |  ●IX、IYレジスタは変化させてはいけません。              | |                                     | |SPEEK〔〈式X〉,〈式Y〉〕                     | |  ●CRT上の(X,Y)座標にある                   | |   キャラクタのディスプレイ・コードを値とします。           | |                                     | |CP$〔〈式1〉,〈式2〉,〈式3〉〕                  | |  ●文字列比較関数、〈式1〉,〈式2〉 は                 | |   それぞれ2組の文字列の先頭アドレスを指します。           | |   〈式3〉 は比較の最終コードを示し、                 | |   〈式1〉 が指す文字列に、このコードが現れたとき           | |   比校を終わります。                         | |   関数値は一致のとき1、不一致のとき、0を値とします。        | |                                     | |CPI〔〈式1〉,”文字列”〕                      | |  ●式1の値を先頭アドレスとする文字列と                | |   『”』クォーテーション内の文字列と比較します。           | |   関数値は一致したとき1、不一致のとき0を値とします。        | |                                     | |TIME関数                               | |  ●内部のタイマの値を値とします。                   | |   タイマの値をセットする場合は、TIME=式 とします。          | |   TIMEの単位は秒です。                        | |   BASICのように60進数にフォーマットされません。         | |                                     | |DOT(〈式X〉,〈式Y〉)                       | |  ●グラフィックRAMの座標(X,Y) に                  | |   点が打たれていれば値は1、なければ0になります。          | |  ●(X,Y) が画面をはみだした場合、1を返します。            | |                                     | ・―――――――――――――――――――――――――――――――――――――・ メモリ・マップ ・―――――――――――――――――――――――――――・ |                           | | $0000・―――――――――――――・      | |      |     モニタ     |      | |      |   TS−1000   |      | |      |             |      | | $1500|―――――――――――――|      | |      |   ランタイム・パッケージ   |      | |      |   グラフィック・パッケージ  |      | | $1800|―――――――――――――|      | |      |  マシン・スタック   |      | | $2000|―――――――――――――|      | |      | PUSH、POPスタック (IYレジスタ) |      | | $2400|―――――――――――――|      | |      |■■■■■■■■■■■■■|      | |      |■■■■WICS■■■■■|      | |      |■■インタープリタ本体■■|      | |      |■■■■■■■■■■■■■|      | | $3800|―――――――――――――|      | |      |    ハッシュ表    |      | | $3C00|―――――――――――――|      | |      |    変数エリア    |      | |      | for,gosubスタック(IXレジスタ) |      | | $4400|―――――――――――――|      | |      |             |      | |      |  ユーザープログラム  |      | |      | |テキスト       |      | |      〜 |           〜      | |      〜 ↓           〜      | |      |  ユーザーオブジェクト・データなど|      | |      |             |      | | $FFFF・―――――――――――――・      | |                           | ・―――――――――――――――――――――――――――・